package es.gesfutbol.web;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.propertyeditors.CustomCollectionEditor;
import org.springframework.mail.MailException;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import es.gesfutbol.dao.ICombinacioGeneralDao;
import es.gesfutbol.dao.ICombinacioPropiaDao;
import es.gesfutbol.dao.IEquipDao;
import es.gesfutbol.dao.IEquipEnPenyistaDao;
import es.gesfutbol.dao.IPenyaDao;
import es.gesfutbol.dao.IPenyistaDao;
import es.gesfutbol.dao.IPercentatgeDao;
import es.gesfutbol.dao.IUsuariRegistratDAO;
import es.gesfutbol.domini.implementacio.CombinacioGeneral;
import es.gesfutbol.domini.implementacio.CombinacioPropia;
import es.gesfutbol.domini.implementacio.Equip;
import es.gesfutbol.domini.implementacio.EquipEnPenyista;
import es.gesfutbol.domini.implementacio.IdEquipEnPenyista;
import es.gesfutbol.domini.implementacio.Penya;
import es.gesfutbol.domini.implementacio.Penyista;
import es.gesfutbol.domini.implementacio.Percentatge;
import es.gesfutbol.domini.implementacio.UsuariRegistrat;
import es.gesfutbol.web.backbean.EquipsIPenyistesBackBean;
import es.gesfutbol.web.backbean.PenyaBackBean;
import es.gesfutbol.web.backbean.RepartirEquipBackBean;
import es.gesfutbol.web.backbean.RolUsuarisBackBean;

public class AdministrarPenyaController extends MultiActionController{

	private static final String ID_PENYA_SESSION = "idDePenya";
	private static final String CANVI_ROL = "El administrador de la peña ha realizado un cambio en tu rol de usuario de la peña.";
	//Constants
//	private String PERCENTATGE_NOT_NUMERIC = "Los porcentajes deben contener valores numéricos";
	private String ENFRONTAMENTS_ANTERIORS = "EnfrontamentsAnteriors";
	private String CLASSIFICACIO = "Classificacio";
	private String LOCAL = "JugaComALocal";
	private String PRIMERA_VOLTA = "ResultatPartitPrimeraVolta";
	private String ULTIMS_RESULTATS = "UltimsResultatsObtinguts";
	private String FIX1 = "generalFix1";
	private String DOBLE1 = "generalDob1";
	private String TRIPLE1 ="generalTrip1";
	private String FIX2 = "generalFix2";
	private String DOBLE2 = "generalDob2";
	private String TRIPLE2 = "generalTrip2";	
	private String FIX3 = "generalFix3";
	private String DOBLE3 = "generalDob3";
	private String TRIPLE3 = "generalTrip3";
	private String COMB_GENERAL_NOT_NUMERIC = "Las combinaciones generales deben contener valores numéricos.";
	private String TYPE_MIS_MATCH = "typemismatch";
	private String PERCENTATGE_NOT_NUMERIC = "Los porcentajes deben contener valores numéricos";
	
	
	private IUsuariRegistratDAO usuariRegistratDao;
	
	private IPenyaDao penyaDao;
	
	private IPenyistaDao penyistaDao;
	
	private IPercentatgeDao percentatgeDao;
	
	private ICombinacioGeneralDao combinacioGeneralDao;
	
	private ICombinacioPropiaDao combinacioPropiaDao;
	
	private IEquipDao equipDao;
	
	private IEquipEnPenyistaDao equipEnPenyistaDao;
	
	private MailSender mailSender;

	private SimpleMailMessage mailMessage; 
	
	public IUsuariRegistratDAO getUsuariRegistratDao() {
		return usuariRegistratDao;
	}
	
	public void setUsuariRegistratDao(IUsuariRegistratDAO usuariRegistratDao) {
		this.usuariRegistratDao = usuariRegistratDao;
	}
	
	public IPenyaDao getPenyaDao() {
		return penyaDao;
	}

	public void setPenyaDao(IPenyaDao penyaDao) {
		this.penyaDao = penyaDao;
	}
	
	public IPenyistaDao getPenyistaDao() {
		return penyistaDao;
	}

	public void setPenyistaDao(IPenyistaDao penyistaDao) {
		this.penyistaDao = penyistaDao;
	}
	
	public IPercentatgeDao getPercentatgeDao() {
		return percentatgeDao;
	}

	public void setPercentatgeDao(IPercentatgeDao percentatgeDao) {
		this.percentatgeDao = percentatgeDao;
	}
	
	public ICombinacioGeneralDao getCombinacioGeneralDao() {
		return combinacioGeneralDao;
	}

	public void setCombinacioGeneralDao(ICombinacioGeneralDao combinacioGeneralDao) {
		this.combinacioGeneralDao = combinacioGeneralDao;
	}

	public ICombinacioPropiaDao getCombinacioPropiaDao() {
		return combinacioPropiaDao;
	}

	public void setCombinacioPropiaDao(ICombinacioPropiaDao combinacioPropiaDao) {
		this.combinacioPropiaDao = combinacioPropiaDao;
	}
	
	public IEquipDao getEquipDao() {
		return equipDao;
	}

	public void setEquipDao(IEquipDao equipDao) {
		this.equipDao = equipDao;
	}
	
	public IEquipEnPenyistaDao getEquipEnPenyistaDao() {
		return equipEnPenyistaDao;
	}

	public void setEquipEnPenyistaDao(IEquipEnPenyistaDao equipEnPenyistaDao) {
		this.equipEnPenyistaDao = equipEnPenyistaDao;
	}
	
	public MailSender getMailSender() {
		return mailSender;
	}

	public void setMailSender(MailSender mailSender) {
		this.mailSender = mailSender;
	}

	public SimpleMailMessage getMailMessage() {
		return mailMessage;
	}

	public void setMailMessage(SimpleMailMessage mailMessage) {
		this.mailMessage = mailMessage;
	}

	@Override
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {

		binder.registerCustomEditor(Set.class, "equipsIPenyistes", 
				new CustomCollectionEditor(List.class));	       
	}		
	
	//	It will be just called when some validation or binding Exception occurs
	//	Otherwise, Spring will bypass it
	public ModelAndView hanldeBindException(HttpServletRequest request, HttpServletResponse response, ServletRequestBindingException bindingException) {
		BindException bindException = (BindException) bindingException.getRootCause();
		BindingResult bindingResult = (BindingResult) bindException.getModel().get(BindingResult.MODEL_KEY_PREFIX + "command");
		String error = bindingResult.getFieldError().getDefaultMessage();
		String code = bindingResult.getFieldError().getCode();
		String campo = bindingResult.getFieldError().getField();
		
		if((code.equalsIgnoreCase(TYPE_MIS_MATCH)) && (campo.equals(FIX1))
				|| (code.equalsIgnoreCase(TYPE_MIS_MATCH)) && (campo.equals(FIX1))
				|| (code.equalsIgnoreCase(TYPE_MIS_MATCH)) && (campo.equals(DOBLE1))
				|| (code.equalsIgnoreCase(TYPE_MIS_MATCH)) && (campo.equals(TRIPLE1))
				|| (code.equalsIgnoreCase(TYPE_MIS_MATCH)) && (campo.equals(FIX2))
				|| (code.equalsIgnoreCase(TYPE_MIS_MATCH)) && (campo.equals(DOBLE2))
				|| (code.equalsIgnoreCase(TYPE_MIS_MATCH)) && (campo.equals(TRIPLE2))
				|| (code.equalsIgnoreCase(TYPE_MIS_MATCH)) && (campo.equals(FIX3))
				|| (code.equalsIgnoreCase(TYPE_MIS_MATCH)) && (campo.equals(DOBLE3))
				|| (code.equalsIgnoreCase(TYPE_MIS_MATCH)) && (campo.equals(TRIPLE3))){
			
			error = COMB_GENERAL_NOT_NUMERIC;
		}else if(code.equalsIgnoreCase(TYPE_MIS_MATCH)){
			error = PERCENTATGE_NOT_NUMERIC;
		}
		
		//Combinacions propies.
		List<CombinacioPropia> comb = combinacioPropiaDao.findAll();
		PenyaBackBean penyaBB = (PenyaBackBean) bindingResult.getTarget();
		Penya penya = penyaDao.findByNom(penyaBB.getNomPenya());
		penya = penyaDao.deproxy(penya);
		//De moment ho fem així perquè només i poden haver 3 combinacions generals.
		// S'haurà de canviar quan volguem fer més combinacions.
		List<CombinacioGeneral> llistaCombGenerals = new ArrayList<CombinacioGeneral>(penya.getCombGenerals());
		if(llistaCombGenerals.size()>0){
			penyaBB.setGeneralFix1(llistaCombGenerals.get(0).getNumeroFixos());
			penyaBB.setGeneralDob1(llistaCombGenerals.get(0).getNumeroDobles());
			penyaBB.setGeneralTrip1(llistaCombGenerals.get(0).getNumeroTriples());
		}
		if(llistaCombGenerals.size()>1){
			penyaBB.setGeneralFix2(llistaCombGenerals.get(1).getNumeroFixos());
			penyaBB.setGeneralDob2(llistaCombGenerals.get(1).getNumeroDobles());
			penyaBB.setGeneralTrip2(llistaCombGenerals.get(1).getNumeroTriples());
		}
		if(llistaCombGenerals.size()>2){
			penyaBB.setGeneralFix3(llistaCombGenerals.get(2).getNumeroFixos());
			penyaBB.setGeneralDob3(llistaCombGenerals.get(2).getNumeroDobles());
			penyaBB.setGeneralTrip3(llistaCombGenerals.get(2).getNumeroTriples());			
		}	
		List<CombinacioPropia> llistaCombPropia = new ArrayList<CombinacioPropia>(penya.getCombPropies());
		if(llistaCombPropia.size()>0){
			penyaBB.setCombPropia1(llistaCombPropia.get(0).getIdCombinacioPropia());
		}
		if(llistaCombPropia.size()>1){
			penyaBB.setCombPropia2(llistaCombPropia.get(1).getIdCombinacioPropia());
		}
		
        return new ModelAndView("usuari/adminPenya")
        .addAllObjects(bindException.getModel())
        .addObject("combGenerals", llistaCombGenerals)
		.addObject("combPropies", llistaCombPropia)
        .addObject("error", error)
        .addObject("combinacionsPropies", comb)
        .addObject("penyaBB",penyaBB);
	}	
	
	public ModelAndView init(HttpServletRequest request,
			HttpServletResponse response)throws Exception{
		
		PenyaBackBean penyaBB = new PenyaBackBean();
		UsuariRegistrat usuari = usuariRegistratDao.findByAlies(request.getParameter("usuari"));
		penyaBB.setIdUsuari(usuari.getIdUsuari());
		penyaBB.setNomUsuari(usuari.getAlies());
		
		Penyista penyista = penyistaDao.findByIdUsuari(usuari.getIdUsuari());
		penyista = penyistaDao.deproxy(penyista);
		Penya penya = penyista.getPenya();
		penya = penyaDao.deproxy(penya);		
		penyaBB.setNomPenya(penya.getNom());
		penyaBB.setDirectorioPenyas(penya.isDirectoriPenya());
		
		//De moment ho fem així perquè només i poden haver 3 combinacions generals.
		// S'haurà de canviar quan volguem fer més combinacions.
		List<CombinacioGeneral> llistaCombGenerals = new ArrayList<CombinacioGeneral>(penya.getCombGenerals());
		if(llistaCombGenerals.size()>0){
			penyaBB.setGeneralFix1(llistaCombGenerals.get(0).getNumeroFixos());
			penyaBB.setGeneralDob1(llistaCombGenerals.get(0).getNumeroDobles());
			penyaBB.setGeneralTrip1(llistaCombGenerals.get(0).getNumeroTriples());
		}
		if(llistaCombGenerals.size()>1){
			penyaBB.setGeneralFix2(llistaCombGenerals.get(1).getNumeroFixos());
			penyaBB.setGeneralDob2(llistaCombGenerals.get(1).getNumeroDobles());
			penyaBB.setGeneralTrip2(llistaCombGenerals.get(1).getNumeroTriples());
		}
		if(llistaCombGenerals.size()>2){
			penyaBB.setGeneralFix3(llistaCombGenerals.get(2).getNumeroFixos());
			penyaBB.setGeneralDob3(llistaCombGenerals.get(2).getNumeroDobles());
			penyaBB.setGeneralTrip3(llistaCombGenerals.get(2).getNumeroTriples());			
		}	
		List<CombinacioPropia> llistaCombPropia = new ArrayList<CombinacioPropia>(penya.getCombPropies());
		if(llistaCombPropia.size()>0){
			penyaBB.setCombPropia1(llistaCombPropia.get(0).getIdCombinacioPropia());
		}
		if(llistaCombPropia.size()>1){
			penyaBB.setCombPropia2(llistaCombPropia.get(1).getIdCombinacioPropia());
		}
		
		List<CombinacioPropia> comb = combinacioPropiaDao.findAll();
		
		//Això s'ha de millorar i gestionar una llista des del backbean
		List<Percentatge> percentatgesPenya = percentatgeDao.findByIdPenya(penya.getIdPenya());
		for(Percentatge p : percentatgesPenya){
			if(p.getTipus().equals(ENFRONTAMENTS_ANTERIORS)){
				penyaBB.setEncuentroAnterior(Integer.valueOf(p.getValor()));
			}else if(p.getTipus().equals(CLASSIFICACIO)){
				penyaBB.setClassificacion(Integer.valueOf(p.getValor()));
			}else if(p.getTipus().equals(LOCAL)){
				penyaBB.setJugarLocal(Integer.valueOf(p.getValor()));
			}else if(p.getTipus().equals(PRIMERA_VOLTA)){
				penyaBB.setPrimeraVuelta(Integer.valueOf(p.getValor()));
			}else if(p.getTipus().equals(ULTIMS_RESULTATS)){
				penyaBB.setUltimosResultados(Integer.valueOf(p.getValor()));
			}
		}
		
		ModelMap model = new ModelMap();
		model.addAttribute("penya", penya);
		model.addAttribute("combGenerals", llistaCombGenerals);
		model.addAttribute("combPropies", llistaCombPropia);
		model.addAttribute("combinacionsPropies", comb);
		model.put("penyaBB", penyaBB);
		return new ModelAndView("usuari/adminPenya", model);
	}
	
	public ModelAndView saveAndUpdate(HttpServletRequest request,
			HttpServletResponse response, PenyaBackBean penyaBB){
		
		Penya penya = penyaDao.findByNom(penyaBB.getNomPenya());
		//Assignem els percentatges.
		Percentatge per1 = percentatgeDao.findByIdPenyaITipus(penya.getIdPenya(), ENFRONTAMENTS_ANTERIORS);
		per1.setValor(String.valueOf(penyaBB.getEncuentroAnterior()));
		percentatgeDao.store(per1);
		
		Percentatge per2 = percentatgeDao.findByIdPenyaITipus(penya.getIdPenya(), CLASSIFICACIO);
		per2.setValor(String.valueOf(penyaBB.getClassificacion()));
		percentatgeDao.store(per2);
		
		Percentatge per3 = percentatgeDao.findByIdPenyaITipus(penya.getIdPenya(), LOCAL);
		per3.setValor(String.valueOf(penyaBB.getJugarLocal()));
		percentatgeDao.store(per3);
		
		Percentatge per4 = percentatgeDao.findByIdPenyaITipus(penya.getIdPenya(), PRIMERA_VOLTA);
		per4.setValor(String.valueOf(penyaBB.getPrimeraVuelta()));
		percentatgeDao.store(per4);
		
		Percentatge per5 = percentatgeDao.findByIdPenyaITipus(penya.getIdPenya(), ULTIMS_RESULTATS);
		per5.setValor(String.valueOf(penyaBB.getUltimosResultados()));
		percentatgeDao.store(per5);
		
		//Assignem les combinacions.
		//Propies
		Set<CombinacioPropia> combinacionsPropies = setCombinacionsPropies(penyaBB);
		//Generals
		Set<CombinacioGeneral> combinacionsGenerals = setCombinacionsGenerals(penyaBB);

		penya.setCombPropies(combinacionsPropies);
		penya.setCombGenerals(combinacionsGenerals);
		penya.setDirectoriPenya(penyaBB.isDirectorioPenyas());
		
		penyaDao.store(penya);		
		
		
		return new ModelAndView("redirect:init.htm?usuari=" + penyaBB.getNomUsuari());
	}
	
	public ModelAndView repartirEquipos (HttpServletRequest request,
			HttpServletResponse response){
		
		//Obtenim la penya.
		Penya penya = penyaDao.findById(Long.valueOf(request.getSession().getAttribute(ID_PENYA_SESSION).toString()));
		penya = penyaDao.deproxy(penya);
		List<Penyista> penyistes = new ArrayList<Penyista>(penya.getPenyistes());
		List<Penyista> penyistesDeproxy = new ArrayList<Penyista>();
		for(Penyista penyista : penyistes){
			if(!penyista.isAdministra()){
				penyista = penyistaDao.deproxyEquips(penyista);
				penyistesDeproxy.add(penyista);
			}
		}
		
		RepartirEquipBackBean repartirEquipBB = new RepartirEquipBackBean();
		//Afegim l'usuari al bb;
		repartirEquipBB.setNomUsuari(request.getParameter("usuari"));
		
		List<EquipsIPenyistesBackBean> llistaEquipIPenyistesBB = new ArrayList<EquipsIPenyistesBackBean>();
		
		List <Equip> equips = equipDao.findAll();
		for(Equip e : equips){
			EquipsIPenyistesBackBean equipIPenyistaBB = new EquipsIPenyistesBackBean();
			equipIPenyistaBB.setIdEquip(e.getIdEquip());
			equipIPenyistaBB.setNomEquip(e.getNom());			
			for(Penyista p : penyistesDeproxy){
				for(EquipEnPenyista equipEnPenyista : p.getEquips()){
					if(equipEnPenyista.getId().getEquip().getIdEquip().equals(e.getIdEquip())){
						equipIPenyistaBB.setIdPenyista(p.getIdPenyista());
						equipIPenyistaBB.setIdOldPenyista(p.getIdPenyista());
					}
				}
			}
			llistaEquipIPenyistesBB.add(equipIPenyistaBB); 
		}
		repartirEquipBB.setEquipsIPenyistes(llistaEquipIPenyistesBB);
		
		ModelMap model = new ModelMap();
		model.put("repartirEquipsBB", repartirEquipBB);
		model.addAttribute("llistaPenyistes",penyistesDeproxy);
		return new ModelAndView("usuari/repartirEquipos", model);
	}
	
	public ModelAndView updateRepartir(HttpServletRequest request,
			HttpServletResponse response, RepartirEquipBackBean repartirEquipBB){
	
		for(EquipsIPenyistesBackBean equipIPenyistaBB : repartirEquipBB.getEquipsIPenyistes()){
			if(equipIPenyistaBB.getIdPenyista() != -1){
				//Creem l'id del EquipEnPenyista vell.
				if(equipIPenyistaBB.getIdOldPenyista() != null && !equipIPenyistaBB.getIdOldPenyista().equals("")){
					IdEquipEnPenyista id = new IdEquipEnPenyista();
					id.setEquip(equipDao.findById(equipIPenyistaBB.getIdEquip()));
					id.setPenyista(penyistaDao.findById(equipIPenyistaBB.getIdOldPenyista()));
					//Cerquem l'EquipEnPenyista a la BBDD.
					EquipEnPenyista equipEnPenyista = equipEnPenyistaDao.findById(id);
					//Eliminem l'actual EquipEnPenyista
					equipEnPenyistaDao.delete(equipEnPenyista);
					//Reasignem el penyista i guardem.
					equipEnPenyista.getId().setPenyista(penyistaDao.findById(equipIPenyistaBB.getIdPenyista()));
					equipEnPenyistaDao.store(equipEnPenyista);
				}else{
					EquipEnPenyista equipEnPenyista = new EquipEnPenyista();
					IdEquipEnPenyista idEquipEnPenyista = new IdEquipEnPenyista();
					idEquipEnPenyista.setEquip(equipDao.findById(equipIPenyistaBB.getIdEquip()));
					idEquipEnPenyista.setPenyista(penyistaDao.findById(equipIPenyistaBB.getIdPenyista()));
					equipEnPenyista.setId(idEquipEnPenyista);
					equipEnPenyista.setActiu(true);
					equipEnPenyistaDao.store(equipEnPenyista);
				}
			}
		}
		
		return new ModelAndView("redirect:repartirEquipos.htm");
	}
	
	public ModelAndView administrarUsuarios (HttpServletRequest request,
			HttpServletResponse response){
		
		Penya penya = penyaDao.findById(Long.valueOf(request.getSession().getAttribute(ID_PENYA_SESSION).toString()));
		penya = penyaDao.deproxy(penya);
		
		List<Penyista> penyistes = new ArrayList<Penyista>(penya.getPenyistes());
		List<Penyista> penyistesDeproxy = new ArrayList<Penyista>();
		for(Penyista p : penyistes){
			p = penyistaDao.deproxyEquips(p);
			penyistesDeproxy.add(p); 
		}
		RolUsuarisBackBean rolUsuariBB = new RolUsuarisBackBean();
		rolUsuariBB.setPenyistes(penyistesDeproxy);
		rolUsuariBB.setNomUsuari(request.getParameter("usuari"));
		
		ModelMap model = new ModelMap();
		model.put("rolUsuariBB", rolUsuariBB);
		model.addAttribute("llistaPenyistes",penyistesDeproxy);
		return new ModelAndView("usuari/rolsUsuaris", model);
	}
	
	public ModelAndView updateRols (HttpServletRequest request,
			HttpServletResponse response, RolUsuarisBackBean rolUsuariBB){
		
		for(Penyista p : rolUsuariBB.getPenyistes()){
			Penyista penyista = penyistaDao.findById(p.getIdPenyista());
			
			if(penyista.isAdministra()!= p.isAdministra()
					|| penyista.isPronostica() != p.isPronostica()
					|| penyista.isAporta() != p.isAporta()){
				
				penyista = penyistaDao.deproxy(penyista);
				penyista.setAdministra(p.isAdministra());
				penyista.setPronostica(p.isPronostica());
				penyista.setAporta(p.isAporta());
				penyistaDao.store(penyista);
				
				//Enviem el mail del canvi.
//				if(penyista.getUsuari().getEmail()!=null && 
//						!penyista.getUsuari().getEmail().equals("")){
//					enviarMail(penyista.getUsuari().getEmail(), CANVI_ROL);	
//				}
			}
			
		}
		return new ModelAndView("redirect:administrarUsuarios.htm");
	}
	
	private Set<CombinacioPropia> setCombinacionsPropies(PenyaBackBean penyaBB) {
		Set<CombinacioPropia> combinacionsPropies = null;
		if(penyaBB.getCombPropia1()!= 0){
			combinacionsPropies = new HashSet<CombinacioPropia>();
			combinacionsPropies.add(combinacioPropiaDao.findById(penyaBB.getCombPropia1()));
		}
		if(penyaBB.getCombPropia2()!= 0){
			if(combinacionsPropies == null){
				combinacionsPropies = new HashSet<CombinacioPropia>();
			}
			combinacionsPropies.add(combinacioPropiaDao.findById(penyaBB.getCombPropia2()));
		}
		return combinacionsPropies;
	}

	private Set<CombinacioGeneral> setCombinacionsGenerals(PenyaBackBean penyaBB) {
		Set<CombinacioGeneral> combinacionsGenerals = null;
		if(penyaBB.getGeneralFix1()!= 0 
				|| penyaBB.getGeneralDob1()!= 0
				|| penyaBB.getGeneralTrip1()!= 0){
			combinacionsGenerals = new HashSet<CombinacioGeneral>();
			combinacionsGenerals.add(combinacioGeneralDao.storeIfExist(penyaBB.getGeneralFix1(),
					penyaBB.getGeneralDob1(),
					penyaBB.getGeneralTrip1()));
		}

		if(penyaBB.getGeneralFix2()!= 0 
				|| penyaBB.getGeneralDob2()!= 0
				|| penyaBB.getGeneralTrip2()!= 0){
			if(combinacionsGenerals == null){
				combinacionsGenerals = new HashSet<CombinacioGeneral>();
			}
			combinacionsGenerals.add(combinacioGeneralDao.storeIfExist(penyaBB.getGeneralFix2(),
					penyaBB.getGeneralDob2(),
					penyaBB.getGeneralTrip2()));
		}

		if(penyaBB.getGeneralFix3()!= 0 
				|| penyaBB.getGeneralDob3()!= 0
				|| penyaBB.getGeneralTrip3()!= 0){
			if(combinacionsGenerals == null){
				combinacionsGenerals = new HashSet<CombinacioGeneral>();
			}
			combinacionsGenerals.add(combinacioGeneralDao.storeIfExist(penyaBB.getGeneralFix3(),
					penyaBB.getGeneralDob3(),
					penyaBB.getGeneralTrip3()));
		}
		return combinacionsGenerals;
	}	

	private void enviarMail(String email, String text){
		SimpleMailMessage msg = new SimpleMailMessage(this.mailMessage);
		msg.setTo(email);
		msg.setText(text);
		try{
			mailSender.send(msg);
		} catch(MailException ex) {
			throw new RuntimeException(ex);
		}
	}
}
